home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
tm2ascii
/
source
/
tm2ascii.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-04
|
39KB
|
1,554 lines
#include "struct.c"
#ifdef _DEBUG
#define MWDEBUG 1
#include "memwatch.h"
__stdargs void kputs(char *);
__stdargs char kgetc(void);
__stdargs void kprintf(char *,...);
#define DEBUG_PUTSTR(a) kputs(a);
#define DEBUG_GETCHR kgetc();
#define DEBUG_PRINTF(a,b) kprintf(a,b);
#else
#define DEBUG_PUTSTR(a)
#define DEBUG_GETCHR
#define DEBUG_PRINTF(a,b)
#endif
#define BUFSIZE 65536
static char Version[] = "$VER: TM2Ascii 1.0 "__DATE__" "__TIME__;
struct List ObjectLists[TMOBJTYPES];
ULONG stopchunks[]={ID_PREF,ID_TMEX,
ID_PREF,ID_TMIM,
ID_PREF,ID_TMSO,
ID_PREF,ID_TMMO,
ID_PREF,ID_TMIC,
ID_PREF,ID_TMDO,
ID_PREF,ID_TMAC};
struct PrefHeader PrefHdrChunk={TMPREFSVERSION,0,0};
/* Exec node */
struct ExecNode {
struct Node en_Node;
ULONG en_Flags;
UWORD en_ExecType;
WORD en_Priority;
LONG en_Delay;
ULONG en_Stack;
char *en_Command;
char *en_CurrentDir;
char *en_HotKey;
char *en_Output;
char *en_Path;
char *en_PubScreen;
};
/* Image node */
struct ImageNode {
struct Node in_Node;
char *in_File;
};
/* Sound node */
struct SoundNode {
struct Node sn_Node;
char *sn_Command;
char *sn_Port;
};
/* Menu node */
struct MenuNode {
struct Node mn_Node;
char *mn_Exec;
char *mn_Sound;
};
/* Icon node */
struct IconNode {
struct Node in_Node;
ULONG in_Flags;
char *in_Exec;
char *in_Image;
char *in_Sound;
LONG in_XPos;
LONG in_YPos;
};
/* Dock node */
struct DockNode {
struct Node dn_Node;
ULONG dn_Flags;
char *dn_HotKey;
char *dn_PubScreen;
char *dn_Title;
struct TextAttr dn_Font;
char *dn_FontDesc;
LONG dn_XPos;
LONG dn_YPos;
ULONG dn_Columns;
struct List *dn_ToolsList;
};
/* Access node */
struct AccessNode {
struct Node an_Node;
struct List an_Entries;
};
/* Tool node */
struct ToolNode {
struct Node tn_Node;
char *tn_Image;
char *tn_Sound;
};
struct Node *GetHead(struct List *List)
{
if (List->lh_Head->ln_Succ)
return List->lh_Head;
else
return NULL;
}
struct Node *GetSucc(struct Node *Node)
{
if (Node->ln_Succ->ln_Succ)
return Node->ln_Succ;
else
return NULL;
}
char *GetConfigStr(UBYTE **buf)
{
char *s=*buf;
char *new;
ULONG len=strlen(s)+1;
/* Allocate string buffer */
if (new=malloc(len)) {
/* Copy string */
strcpy(new,s);
/* Correct pointer */
*buf+=len;
}
return(new);
}
/* Write one config string and correct pointer */
BOOL PutConfigStr(char *s, UBYTE **buf)
{
/* string valid? */
if (s) {
/* Copy string to buffer */
strcpy(*buf,s);
/* Correct pointer */
*buf+=strlen(s)+1;
return(TRUE);
}
return(FALSE);
}
/* Free exec node */
void FreeExecNode(struct Node *node)
{
struct ExecNode *en=(struct ExecNode *) node;
char *s;
if (s=en->en_Node.ln_Name) free(s);
if (s=en->en_Command) free(s);
if (s=en->en_CurrentDir) free(s);
if (s=en->en_Output) free(s);
if (s=en->en_Path) free(s);
if (s=en->en_HotKey) free(s);
if (s=en->en_PubScreen) free(s);
/* Free node */
FreeMem(en,sizeof(struct ExecNode));
}
/* Free image node */
void FreeImageNode(struct Node *node)
{
struct ImageNode *in=(struct ImageNode *) node;
char *s;
if (s=in->in_Node.ln_Name) free(s);
if (s=in->in_File) free(s);
/* Free node */
FreeMem(in,sizeof(struct ImageNode));
}
/* Free sound node */
void FreeSoundNode(struct Node *node)
{
struct SoundNode *sn=(struct SoundNode *) node;
char *s;
if (s=sn->sn_Node.ln_Name) free(s);
if (s=sn->sn_Command) free(s);
if (s=sn->sn_Port) free(s);
/* Free node */
FreeMem(sn,sizeof(struct SoundNode));
}
/* Free menu node */
void FreeMenuNode(struct Node *node)
{
struct MenuNode *mn=(struct MenuNode *) node;
char *s;
if (s=mn->mn_Node.ln_Name) free(s);
if (s=mn->mn_Exec) free(s);
if (s=mn->mn_Sound) free(s);
/* Free node */
FreeMem(mn,sizeof(struct MenuNode));
}
/* Free icon node */
void FreeIconNode(struct Node *node)
{
struct IconNode *in=(struct IconNode *) node;
char *s;
if (s=in->in_Node.ln_Name) free(s);
if (s=in->in_Exec) free(s);
if (s=in->in_Image) free(s);
if (s=in->in_Sound) free(s);
/* Free node */
FreeMem(in,sizeof(struct IconNode));
}
/* Free tool list */
void FreeToolsList(struct List *toollist)
{
struct ToolNode *tn1,*tn2=(struct ToolNode *)GetHead(toollist);
/* Free tool nodes */
while (tn1=tn2) {
char *s;
/* Get next node */
tn2=(struct ToolNode *)GetSucc(tn1);
/* Remove node */
Remove((struct Node *) tn1);
/* Free node */
if (s=tn1->tn_Node.ln_Name) free(s);
if (s=tn1->tn_Image) free(s);
if (s=tn1->tn_Sound) free(s);
FreeMem(tn1,sizeof(struct ToolNode));
}
free(toollist);
}
/* Free dock node */
void FreeDockNode(struct Node *node)
{
struct DockNode *dn=(struct DockNode *) node;
char *s;
if (s=dn->dn_Node.ln_Name) free(s);
if (s=dn->dn_HotKey) free(s);
if (s=dn->dn_PubScreen) free(s);
if (s=dn->dn_Title) free(s);
if (s=dn->dn_Font.ta_Name) free(s);
if (s=dn->dn_FontDesc) free(s);
/* Free tool list */
if (dn->dn_ToolsList) FreeToolsList(dn->dn_ToolsList);
/* Free node */
FreeMem(dn,sizeof(struct DockNode));
}
/* Free Access node */
void FreeAccessNode(struct Node *node)
{
struct AccessNode *an=(struct AccessNode *) node;
char *s;
if (s=an->an_Node.ln_Name) free(s);
/* Free entries */
{
struct Node *aen1,*aen2=GetHead(&an->an_Entries);
/* Scan list */
while (aen1=aen2) {
/* Get next node */
aen2=GetSucc(aen1);
/* Remove node */
Remove(aen1);
/* Free node */
if (s=aen1->ln_Name) free(s);
FreeMem(aen1,sizeof(struct Node));
}
}
/* Free Node */
FreeMem(an,sizeof(struct AccessNode));
}
/* Read TMEX IFF chunk into Exec node */
struct Node *ReadExecNode(UBYTE *buf)
{
struct ExecNode *en;
/* Allocate memory for node */
if (en=AllocMem(sizeof(struct ExecNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct ExecPrefsObject *epo=(struct ExecPrefsObject *) buf;
ULONG sbits=epo->epo_StringBits;
UBYTE *ptr=(UBYTE *) &epo[1];
if ((!(sbits & EXPO_NAME) || (en->en_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_COMMAND) || (en->en_Command=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_CURDIR) || (en->en_CurrentDir=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_HOTKEY) || (en->en_HotKey=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_OUTPUT) || (en->en_Output=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_PATH) || (en->en_Path=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_PSCREEN) || (en->en_PubScreen=GetConfigStr(&ptr)))) {
/* Copy flags & values */
en->en_Flags=epo->epo_Flags;
en->en_ExecType=epo->epo_ExecType;
en->en_Priority=epo->epo_Priority;
en->en_Delay=epo->epo_Delay;
en->en_Stack=epo->epo_Stack;
/* All OK. */
return(en);
}
/* Call failed */
FreeExecNode((struct Node *) en);
}
return(NULL);
}
/* Write Exec node to TMEX IFF chunk */
BOOL WriteExecNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct ExecNode *en=(struct ExecNode *) node;
struct ExecPrefsObject *epo=(struct ExecPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &epo[1];
/* Copy strings */
if (PutConfigStr(en->en_Node.ln_Name,&ptr)) sbits|=EXPO_NAME;
if (PutConfigStr(en->en_Command,&ptr)) sbits|=EXPO_COMMAND;
if (PutConfigStr(en->en_CurrentDir,&ptr)) sbits|=EXPO_CURDIR;
if (PutConfigStr(en->en_HotKey,&ptr)) sbits|=EXPO_HOTKEY;
if (PutConfigStr(en->en_Output,&ptr)) sbits|=EXPO_OUTPUT;
if (PutConfigStr(en->en_Path,&ptr)) sbits|=EXPO_PATH;
if (PutConfigStr(en->en_PubScreen,&ptr)) sbits|=EXPO_PSCREEN;
/* set string bits */
epo->epo_StringBits=sbits;
/* Copy flags & values */
epo->epo_Flags=en->en_Flags;
epo->epo_ExecType=en->en_ExecType;
epo->epo_Priority=en->en_Priority;
epo->epo_Delay=en->en_Delay;
epo->epo_Stack=en->en_Stack;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMEX,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Read TMIM IFF chunk into Image node */
struct Node *ReadImageNode(UBYTE *buf)
{
struct ImageNode *in;
/* Allocate memory for node */
if (in=AllocMem(sizeof(struct ImageNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct ImagePrefsObject *ipo=(struct ImagePrefsObject *) buf;
ULONG sbits=ipo->ipo_StringBits;
UBYTE *ptr=(UBYTE *) &ipo[1];
if ((!(sbits & IMPO_NAME) || (in->in_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & IMPO_FILE) || (in->in_File=GetConfigStr(&ptr))))
/* All OK. */
return(in);
/* Call failed */
FreeImageNode((struct Node *) in);
}
return(NULL);
}
/* Write Image node to TMIM IFF chunk */
BOOL WriteImageNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct ImageNode *in=(struct ImageNode *) node;
struct ImagePrefsObject *ipo=(struct ImagePrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &ipo[1];
/* Copy strings */
if (PutConfigStr(in->in_Node.ln_Name,&ptr)) sbits|=IMPO_NAME;
if (PutConfigStr(in->in_File,&ptr)) sbits|=IMPO_FILE;
/* set string bits */
ipo->ipo_StringBits=sbits;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMIM,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Read TMSO IFF chunk into Sound node */
struct Node *ReadSoundNode(UBYTE *buf)
{
struct SoundNode *sn;
/* Allocate memory for node */
if (sn=AllocMem(sizeof(struct SoundNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct SoundPrefsObject *spo=(struct SoundPrefsObject *) buf;
ULONG sbits=spo->spo_StringBits;
UBYTE *ptr=(UBYTE *) &spo[1];
if ((!(sbits & SOPO_NAME) || (sn->sn_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & SOPO_COMMAND) || (sn->sn_Command=GetConfigStr(&ptr))) &&
(!(sbits & SOPO_PORT) || (sn->sn_Port=GetConfigStr(&ptr))))
/* All OK. */
return(sn);
/* Call failed */
FreeSoundNode((struct Node *) sn);
}
return(NULL);
}
/* Write Sound node to TMSO IFF chunk */
BOOL WriteSoundNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct SoundNode *sn=(struct SoundNode *) node;
struct SoundPrefsObject *spo=(struct SoundPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &spo[1];
/* Copy strings */
if (PutConfigStr(sn->sn_Node.ln_Name,&ptr)) sbits|=SOPO_NAME;
if (PutConfigStr(sn->sn_Command,&ptr)) sbits|=SOPO_COMMAND;
if (PutConfigStr(sn->sn_Port,&ptr)) sbits|=SOPO_PORT;
/* set string bits */
spo->spo_StringBits=sbits;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMSO,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Read TMMO IFF chunk into Menu node */
struct Node *ReadMenuNode(UBYTE *buf)
{
struct MenuNode *mn;
/* Allocate memory for node */
if (mn=AllocMem(sizeof(struct MenuNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct MenuPrefsObject *mpo=(struct MenuPrefsObject *) buf;
ULONG sbits=mpo->mpo_StringBits;
UBYTE *ptr=(UBYTE *) &mpo[1];
if ((!(sbits & MOPO_NAME) || (mn->mn_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & MOPO_EXEC) || (mn->mn_Exec=GetConfigStr(&ptr))) &&
(!(sbits & MOPO_SOUND) || (mn->mn_Sound=GetConfigStr(&ptr))))
/* All OK. */
return(mn);
/* Call failed */
FreeMenuNode((struct Node *) mn);
}
return(NULL);
}
/* Write Menu node to TMMO IFF chunk */
BOOL WriteMenuNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct MenuNode *mn=(struct MenuNode *) node;
struct MenuPrefsObject *mpo=(struct MenuPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &mpo[1];
/* Copy strings */
if (PutConfigStr(mn->mn_Node.ln_Name,&ptr)) sbits|=MOPO_NAME;
if (PutConfigStr(mn->mn_Exec,&ptr)) sbits|=MOPO_EXEC;
if (PutConfigStr(mn->mn_Sound,&ptr)) sbits|=MOPO_SOUND;
/* set string bits */
mpo->mpo_StringBits=sbits;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMMO,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Read TMIC IFF chunk into Icon node */
struct Node *ReadIconNode(UBYTE *buf)
{
struct IconNode *in;
/* Allocate memory for node */
if (in=AllocMem(sizeof(struct IconNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct IconPrefsObject *ipo=(struct IconPrefsObject *) buf;
ULONG sbits=ipo->ipo_StringBits;
UBYTE *ptr=(UBYTE *) &ipo[1];
if ((!(sbits & ICPO_NAME) || (in->in_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & ICPO_EXEC) || (in->in_Exec=GetConfigStr(&ptr))) &&
(!(sbits & ICPO_IMAGE) || (in->in_Image=GetConfigStr(&ptr))) &&
(!(sbits & ICPO_SOUND) || (in->in_Sound=GetConfigStr(&ptr)))) {
/* Copy flags & values */
in->in_Flags=ipo->ipo_Flags;
in->in_XPos=ipo->ipo_XPos;
in->in_YPos=ipo->ipo_YPos;
/* All OK. */
return(in);
}
/* Call failed */
FreeIconNode((struct Node *) in);
}
return(NULL);
}
/* Write Icon node to TMIC IFF chunk */
BOOL WriteIconNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct IconNode *in=(struct IconNode *) node;
struct IconPrefsObject *ipo=(struct IconPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &ipo[1];
/* Copy strings */
if (PutConfigStr(in->in_Node.ln_Name,&ptr)) sbits|=ICPO_NAME;
if (PutConfigStr(in->in_Exec,&ptr)) sbits|=ICPO_EXEC;
if (PutConfigStr(in->in_Image,&ptr)) sbits|=ICPO_IMAGE;
if (PutConfigStr(in->in_Sound,&ptr)) sbits|=ICPO_SOUND;
/* set string bits */
ipo->ipo_StringBits=sbits;
/* Copy flags & values */
ipo->ipo_Flags=in->in_Flags;
ipo->ipo_XPos=in->in_XPos;
ipo->ipo_YPos=in->in_YPos;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMIC,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Read TMDO IFF chunk into Dock node */
struct Node *ReadDockNode(UBYTE *buf)
{
struct DockNode *dn;
/* Allocate memory for node */
if (dn=AllocMem(sizeof(struct DockNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct DockPrefsObject *dpo=(struct DockPrefsObject *) buf;
ULONG sbits=dpo->dpo_StringBits;
UBYTE *ptr=(UBYTE *) &dpo[1];
struct List *toolslist;
if ((!(sbits & DOPO_NAME) || (dn->dn_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_HOTKEY) || (dn->dn_HotKey=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_PSCREEN) || (dn->dn_PubScreen=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_TITLE) || (dn->dn_Title=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_FONTNAME) || (dn->dn_Font.ta_Name=GetConfigStr(&ptr))) &&
(toolslist=malloc(sizeof(struct List)))) {
LONG tools=0;
UBYTE tlflags;
/* Init list */
NewList(toolslist);
dn->dn_ToolsList=toolslist;
/* Get tools */
while ((tlflags=*ptr++) & DOPOT_CONTINUE) {
struct ToolNode *tn;
if (tn=AllocMem(sizeof(struct ToolNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Add tool to list */
AddTail(toolslist,(struct Node *) tn);
if ((!(tlflags & DOPOT_EXEC) || (tn->tn_Node.ln_Name=
GetConfigStr(&ptr))) &&
(!(tlflags & DOPOT_IMAGE) || (tn->tn_Image=GetConfigStr(&ptr))) &&
(!(tlflags & DOPOT_SOUND) || (tn->tn_Sound=GetConfigStr(&ptr))))
/* All OK. */
tools++;
else {
/* Error */
tools=-1;
break;
}
} else {
/* No memory. */
tools=-1;
break;
}
}
/* Error? */
if (tools!=-1) {
/* Got tools? */
if (tools==0) {
/* No, free list structure */
free(toolslist);
dn->dn_ToolsList=NULL;
}
/* Copy flags & values */
dn->dn_Flags=dpo->dpo_Flags;
dn->dn_XPos=dpo->dpo_XPos;
dn->dn_YPos=dpo->dpo_YPos;
dn->dn_Columns=dpo->dpo_Columns;
dn->dn_Font.ta_YSize=dpo->dpo_Font.ta_YSize;
dn->dn_Font.ta_Style=dpo->dpo_Font.ta_Style;
dn->dn_Font.ta_Flags=dpo->dpo_Font.ta_Flags;
/* All OK. */
return(dn);
}
}
/* Call failed */
FreeDockNode((struct Node *) dn);
}
return(NULL);
}
/* Write Dock node to TMDO IFF chunk */
BOOL WriteDockNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct DockNode *dn=(struct DockNode *) node;
struct DockPrefsObject *dpo=(struct DockPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &dpo[1];
/* Copy strings */
if (PutConfigStr(dn->dn_Node.ln_Name,&ptr)) sbits|=DOPO_NAME;
if (PutConfigStr(dn->dn_HotKey,&ptr)) sbits|=DOPO_HOTKEY;
if (PutConfigStr(dn->dn_PubScreen,&ptr)) sbits|=DOPO_PSCREEN;
if (PutConfigStr(dn->dn_Title,&ptr)) sbits|=DOPO_TITLE;
if (PutConfigStr(dn->dn_Font.ta_Name,&ptr)) sbits|=DOPO_FONTNAME;
/* set string bits */
dpo->dpo_StringBits=sbits;
/* Write tool list */
if (dn->dn_ToolsList) {
struct ToolNode *tn=(struct ToolNode *)GetHead(dn->dn_ToolsList);
while (tn) {
UBYTE *flptr=ptr++;
UBYTE tfl=DOPOT_CONTINUE;
if (PutConfigStr(tn->tn_Node.ln_Name,&ptr)) tfl|=DOPOT_EXEC;
if (PutConfigStr(tn->tn_Image,&ptr)) tfl|=DOPOT_IMAGE;
if (PutConfigStr(tn->tn_Sound,&ptr)) tfl|=DOPOT_SOUND;
/* Put flags */
*flptr=tfl;
/* Get next node */
tn=(struct ToolNode *)GetSucc(tn);
}
}
/* Append terminator */
*ptr++=0;
/* Copy flags & values */
dpo->dpo_Flags=dn->dn_Flags;
dpo->dpo_XPos=dn->dn_XPos;
dpo->dpo_YPos=dn->dn_YPos;
dpo->dpo_Columns=dn->dn_Columns;
dpo->dpo_Font.ta_YSize=dn->dn_Font.ta_YSize;
dpo->dpo_Font.ta_Style=dn->dn_Font.ta_Style;
dpo->dpo_Font.ta_Flags=dn->dn_Font.ta_Flags;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMDO,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Read TMAC IFF chunk into Access node */
struct Node *ReadAccessNode(UBYTE *buf)
{
struct AccessNode *an;
/* Allocate memory for node */
if (an=AllocMem(sizeof(struct AccessNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct AccessPrefsObject *apo=(struct AccessPrefsObject *) buf;
ULONG sbits=apo->apo_StringBits;
UBYTE *ptr=(UBYTE *) &apo[1];
if (!(sbits & DOPO_NAME) || (an->an_Node.ln_Name=GetConfigStr(&ptr))) {
LONG entries=0;
UBYTE enflags;
/* Init list */
NewList(&an->an_Entries);
/* Get tools */
while ((enflags=*ptr++) & AOPOE_CONTINUE) {
struct Node *aen;
if (aen=AllocMem(sizeof(struct Node),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Add tool to list */
AddTail(&an->an_Entries,aen);
if (!(enflags & AOPOE_EXEC) || (aen->ln_Name=GetConfigStr(&ptr)))
/* All OK. */
entries++;
else {
/* Error */
entries=-1;
break;
}
} else {
/* No memory. */
entries=-1;
break;
}
}
/* Error? All OK. */
if (entries!=-1) return(an);
}
/* Call failed */
FreeAccessNode((struct Node *) an);
}
return(NULL);
}
/* Write Access node to TMAC IFF chunk */
BOOL WriteAccessNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct AccessNode *an=(struct AccessNode *) node;
struct AccessPrefsObject *apo=(struct AccessPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &apo[1];
/* Copy strings */
if (PutConfigStr(an->an_Node.ln_Name,&ptr)) sbits|=AOPO_NAME;
/* set string bits */
apo->apo_StringBits=sbits;
/* Write entry list */
{
struct Node *aen=GetHead(&an->an_Entries);
while (aen) {
UBYTE *flptr=ptr++;
UBYTE aefl=AOPOE_CONTINUE;
if (PutConfigStr(aen->ln_Name,&ptr)) aefl|=AOPOE_EXEC;
/* Put flags */
*flptr=aefl;
/* Get next node */
aen=GetSucc(aen);
}
}
/* Append terminator */
*ptr++=0;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMAC,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}
/* Function tables */
ReadNodeFuncPtr ReadNodeFunctions[TMOBJTYPES]={
ReadExecNode,
ReadImageNode,
ReadSoundNode,
ReadMenuNode,
ReadIconNode,
ReadDockNode,
ReadAccessNode
};
WriteNodeFuncPtr WriteNodeFunctions[TMOBJTYPES]={
WriteExecNode,
WriteImageNode,
WriteSoundNode,
WriteMenuNode,
WriteIconNode,
WriteDockNode,
WriteAccessNode
};
FreeNodeFuncPtr FreeNodeFunctions[TMOBJTYPES]={FreeExecNode,
FreeImageNode,
FreeSoundNode,
FreeMenuNode,
FreeIconNode,
FreeDockNode,
FreeAccessNode};
/* Read config file */
BOOL ReadConfigFile(char *filename)
{
UBYTE *configbuf;
BOOL rc=FALSE;
DEBUG_PRINTF("read config from '%s'\n",filename);
/* Allocate memory for config buffer */
if (configbuf=malloc(BUFSIZE)) {
struct IFFHandle *iff;
DEBUG_PRINTF("config buffer: 0x%08lx\n",configbuf)
/* Allocate IFF handle */
if (iff=AllocIFF()) {
/* Every error will be ignored after this point! */
rc=TRUE;
DEBUG_PRINTF("IFF Handle: 0x%08lx\n",iff);
/* Open IFF File */
if (iff->iff_Stream=Open(filename,MODE_OLDFILE)) {
/* Init IFF handle */
InitIFFasDOS(iff);
DEBUG_PRINTF("IFF Stream: 0x%08lx\n",iff->iff_Stream);
/* Open IFF handle */
if (!OpenIFF(iff,IFFF_READ)) {
DEBUG_PUTSTR("IFF open\n");
/* Start IFF parsing */
if (!ParseIFF(iff,IFFPARSE_STEP)) {
struct ContextNode *cn;
DEBUG_PUTSTR("First IFF scan step\n");
/* Check IFF type and set IFF chunk types */
if ((cn=CurrentChunk(iff)) && (cn->cn_ID==ID_FORM) &&
(cn->cn_Type==ID_PREF) &&
!PropChunk(iff,ID_PREF,ID_PRHD) &&
!StopChunks(iff,stopchunks,TMOBJTYPES) &&
!StopOnExit(iff,ID_PREF,ID_FORM) &&
!ParseIFF(iff,IFFPARSE_SCAN)) {
/* First stop chunk encountered */
struct StoredProperty *sp;
/* Get pointer to PRHD chunk */
if (sp=FindProp(iff,ID_PREF,ID_PRHD)) {
struct PrefHeader *ph=(struct PrefHeader *) sp->sp_Data;
/* Check file version number */
if (ph->ph_Version==TMPREFSVERSION) {
/* Parse IFF chunks */
do {
/* Get current chunk */
if (cn=CurrentChunk(iff)) {
LONG type;
DEBUG_PRINTF("chunk ID: 0x%08lx",cn->cn_ID);
DEBUG_PRINTF(" size: 0x%08lx",cn->cn_Size);
/* Read IFF chunk according to chunk ID */
switch(cn->cn_ID) {
case ID_TMEX: type=TMOBJTYPE_EXEC;
break;
case ID_TMIM: type=TMOBJTYPE_IMAGE;
break;
case ID_TMSO: type=TMOBJTYPE_SOUND;
break;
case ID_TMMO: type=TMOBJTYPE_MENU;
break;
case ID_TMIC: type=TMOBJTYPE_ICON;
break;
case ID_TMDO: type=TMOBJTYPE_DOCK;
break;
case ID_TMAC: type=TMOBJTYPE_ACCESS;
break;
default: type=-1;
break;
}
DEBUG_PRINTF(" type: %ld\n",type);
/* valid type? */
if (type!=-1) {
ULONG size=cn->cn_Size;
/* Read chunk */
if (ReadChunkBytes(iff,configbuf,size)==size) {
struct Node *node;
DEBUG_PUTSTR("chunk read\n");
/* Interpret chunk contents */
if (node=(*ReadNodeFunctions[type])(configbuf)) {
DEBUG_PRINTF("new node: 0x%08lx\n",node);
/* Make sure ln_Name is valid */
if (!node->ln_Name) node->ln_Name=strdup("");
/* Append new node to list */
AddTail(&ObjectLists[type],node);
}
}
}
}
/* Next parse step */
} while (!ParseIFF(iff,IFFPARSE_SCAN));
}
}
}
}
CloseIFF(iff);
}
Close(iff->iff_Stream);
}
FreeIFF(iff);
}
free(configbuf);
}
return(rc);
}
/* Write config file */
BOOL WriteConfigFile(char *filename)
{
UBYTE *configbuf;
BOOL rc=FALSE;
DEBUG_PRINTF("write config to '%s'\n",filename);
/* Allocate memory for config buffer */
if (configbuf=malloc(BUFSIZE)) {
struct IFFHandle *iff;
DEBUG_PRINTF("config buffer: 0x%08lx\n",configbuf)
/* Allocate IFF handle */
if (iff=AllocIFF()) {
DEBUG_PRINTF("IFF Handle: 0x%08lx\n",iff);
/* Open IFF File */
if (iff->iff_Stream=Open(filename,MODE_NEWFILE)) {
/* Init IFF handle */
InitIFFasDOS(iff);
DEBUG_PRINTF("IFF Stream: 0x%08lx\n",iff->iff_Stream);
/* Open IFF handle */
if (!OpenIFF(iff,IFFF_WRITE)) {
DEBUG_PUTSTR("IFF open\n");
/* Push FORM IFF chunk */
if (!PushChunk(iff,ID_PREF,ID_FORM,IFFSIZE_UNKNOWN)) {
/* Write PRHD IFF chunk */
if (!PushChunk(iff,0,ID_PRHD,sizeof(struct PrefHeader)) &&
(WriteChunkBytes(iff,(UBYTE *) &PrefHdrChunk,
sizeof(struct PrefHeader))
==sizeof(struct PrefHeader)) &&
!PopChunk(iff))
/* Set return code */
rc=TRUE;
/* error? */
if (rc) {
ULONG i;
/* No, scan all object lists */
for (i=0; (i<TMOBJTYPES) && rc; i++) {
struct Node *node=GetHead(&ObjectLists[i]);
WriteNodeFuncPtr wnfp=WriteNodeFunctions[i];
/* Scan list */
while (node && rc) {
/* Convert node into IFF chunk */
rc=(*wnfp)(iff,configbuf,node);
/* Get next node */
node=GetSucc(node);
}
}
}
}
CloseIFF(iff);
}
Close(iff->iff_Stream);
/* Clear execution flag */
SetProtection(filename,FIBF_EXECUTE);
}
FreeIFF(iff);
}
free(configbuf);
}
return(rc);
}
/* Free all preferences objects */
void FreeAllObjects(void)
{
int i;
for (i=0; i<TMOBJTYPES; i++) {
struct List *list=&ObjectLists[i];
FreeNodeFuncPtr freefunc=FreeNodeFunctions[i];
struct Node *node;
/* Scan list and free nodes */
while (node=RemHead(list)) (*freefunc)(node);
}
}
void WriteAscii(char *FileName)
{
FILE *f;
if (f = fopen(FileName, "w"))
{
struct Node *Node;
fprintf(f, "Exec Objects\n");
for(Node = ObjectLists[TMOBJTYPE_EXEC].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct ExecNode *en = (struct ExecNode *)Node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "%lu %ld %d %ld %lu\n", en->en_Flags, en->en_ExecType, en->en_Priority,
en->en_Delay, en->en_Stack);
fprintf(f, "%s\n%s\n%s\n%s\n%s\n%s\n", en->en_Command, en->en_CurrentDir,
en->en_HotKey, en->en_Output,
en->en_Path, en->en_PubScreen);
}
fprintf(f, "---\n");
fprintf(f, "Image Objects\n");
for(Node = ObjectLists[TMOBJTYPE_IMAGE].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct ImageNode *in = (struct ImageNode *)Node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "%s\n", in->in_File);
}
fprintf(f, "---\n");
fprintf(f, "Sound Objects\n");
for(Node = ObjectLists[TMOBJTYPE_SOUND].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct SoundNode *sn = (struct SoundNode *)Node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "%s\n", sn->sn_Command);
fprintf(f, "%s\n", sn->sn_Port);
}
fprintf(f, "---\n");
fprintf(f, "Menu Objects\n");
for(Node = ObjectLists[TMOBJTYPE_MENU].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct MenuNode *mn = (struct MenuNode *)Node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "%s\n", mn->mn_Exec);
fprintf(f, "%s\n", mn->mn_Sound);
}
fprintf(f, "---\n");
fprintf(f, "Icon Objects\n");
for(Node = ObjectLists[TMOBJTYPE_ICON].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct IconNode *in = (struct IconNode *)Node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "%lu\n", in->in_Flags);
fprintf(f, "%s\n%s\n%s\n", in->in_Exec, in->in_Image, in->in_Sound);
fprintf(f, "%ld %ld\n", in->in_XPos, in->in_YPos);
}
fprintf(f, "---\n");
fprintf(f, "Dock Objects\n");
for(Node = ObjectLists[TMOBJTYPE_DOCK].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct DockNode *dn = (struct DockNode *)Node;
struct Node *node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "%lu\n", dn->dn_Flags);
fprintf(f, "%s\n%s\n%s\n", dn->dn_HotKey, dn->dn_PubScreen, dn->dn_Title);
fprintf(f, "%s\n%u %u %u\n", dn->dn_Font.ta_Name, dn->dn_Font.ta_YSize,
dn->dn_Font.ta_Style, dn->dn_Font.ta_Flags);
fprintf(f, "%ld %ld\n", dn->dn_XPos, dn->dn_YPos);
fprintf(f, "%lu\n", dn->dn_Columns);
fprintf(f, "Tools\n");
for(node = dn->dn_ToolsList->lh_Head; node->ln_Succ; node = node->ln_Succ)
{
struct ToolNode *tn = (struct ToolNode *)node;
fprintf(f, "%s\n", node->ln_Name);
fprintf(f, "%s\n%s\n", tn->tn_Image, tn->tn_Sound);
}
fprintf(f, "---\n");
}
fprintf(f, "---\n");
fprintf(f, "Access Objects\n");
for(Node = ObjectLists[TMOBJTYPE_ACCESS].lh_Head; Node->ln_Succ; Node = Node->ln_Succ)
{
struct AccessNode *an = (struct AccessNode *)Node;
struct Node *node;
fprintf(f, "%s\n", Node->ln_Name);
fprintf(f, "Entries\n");
for(node = an->an_Entries.lh_Head; node->ln_Succ; node = node->ln_Succ)
fprintf(f, "%s\n", node->ln_Name);
fprintf(f, "---\n");
}
fprintf(f, "---\n");
fclose(f);
}
else
fprintf(stderr, "can't open %s\n", FileName);
}
char *AllocStr(char *s)
{
int len;
char *Buffer, *t;
t = s; len = 0;
while ((*t != '\0') && (*t != '\n'))
{
t++;
len++;
}
s[len] = '\0';
if (len == 0)
Buffer = NULL;
else
{
Buffer = malloc(len+1);
strcpy(Buffer, s);
}
return Buffer;
}
#define MLEN 1024
void ReadAscii(char *FileName)
{
FILE *f;
if (f = fopen(FileName, "r"))
{
char s[MLEN];
while (fgets(s, MLEN, f))
{
if (Stricmp(s, "Exec Objects\n") == 0)
{
struct ExecNode *en;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
en = AllocMem(sizeof(struct ExecNode), MEMF_PUBLIC|MEMF_CLEAR);
en->en_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
sscanf(s, "%lu %hd %hd %ld %lu\n", &en->en_Flags, &en->en_ExecType,
&en->en_Priority, &en->en_Delay,
&en->en_Stack);
fgets(s, MLEN, f);
en->en_Command = AllocStr(s);
fgets(s, MLEN, f);
en->en_CurrentDir = AllocStr(s);
fgets(s, MLEN, f);
en->en_HotKey = AllocStr(s);
fgets(s, MLEN, f);
en->en_Output = AllocStr(s);
fgets(s, MLEN, f);
en->en_Path = AllocStr(s);
fgets(s, MLEN, f);
en->en_PubScreen = AllocStr(s);
fgets(s, MLEN, f);
AddTail(&ObjectLists[TMOBJTYPE_EXEC], en);
}
}
else if (Stricmp(s, "Image Objects\n") == 0)
{
struct ImageNode *in;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
in = AllocMem(sizeof(struct ImageNode), MEMF_PUBLIC|MEMF_CLEAR);
in->in_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
in->in_File = AllocStr(s);
fgets(s, MLEN, f);
AddTail(&ObjectLists[TMOBJTYPE_IMAGE], in);
}
}
else if (Stricmp(s, "Sound Objects\n") == 0)
{
struct SoundNode *sn;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
sn = AllocMem(sizeof(struct SoundNode), MEMF_PUBLIC|MEMF_CLEAR);
sn->sn_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
sn->sn_Command = AllocStr(s);
fgets(s, MLEN, f);
sn->sn_Port = AllocStr(s);
fgets(s, MLEN, f);
AddTail(&ObjectLists[TMOBJTYPE_SOUND], sn);
}
}
else if (Stricmp(s, "Menu Objects\n") == 0)
{
struct MenuNode *mn;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
mn = AllocMem(sizeof(struct MenuNode), MEMF_PUBLIC|MEMF_CLEAR);
mn->mn_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
mn->mn_Exec = AllocStr(s);
fgets(s, MLEN, f);
mn->mn_Sound = AllocStr(s);
fgets(s, MLEN, f);
AddTail(&ObjectLists[TMOBJTYPE_MENU], mn);
}
}
else if (Stricmp(s, "Icon Objects\n") == 0)
{
struct IconNode *in;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
in = AllocMem(sizeof(struct IconNode), MEMF_PUBLIC|MEMF_CLEAR);
in->in_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
sscanf(s, "%lu\n", &in->in_Flags);
fgets(s, MLEN, f);
in->in_Exec = AllocStr(s);
fgets(s, MLEN, f);
in->in_Image = AllocStr(s);
fgets(s, MLEN, f);
in->in_Sound = AllocStr(s);
fgets(s, MLEN, f);
sscanf(s, "%ld %ld\n", &in->in_XPos, &in->in_YPos);
fgets(s, MLEN, f);
AddTail(&ObjectLists[TMOBJTYPE_ICON], in);
}
}
else if (Stricmp(s, "Dock Objects\n") == 0)
{
struct DockNode *dn;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
UWORD h1,h2;
dn = AllocMem(sizeof(struct DockNode), MEMF_PUBLIC|MEMF_CLEAR);
dn->dn_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
sscanf(s, "%lu\n", &dn->dn_Flags);
fgets(s, MLEN, f);
dn->dn_HotKey = AllocStr(s);
fgets(s, MLEN, f);
dn->dn_PubScreen = AllocStr(s);
fgets(s, MLEN, f);
dn->dn_Title = AllocStr(s);
fgets(s, MLEN, f);
dn->dn_Font.ta_Name = AllocStr(s);
fgets(s, MLEN, f);
sscanf(s, "%hu %hu %hu\n", &dn->dn_Font.ta_YSize, &h1, &h2);
dn->dn_Font.ta_Style = h1;
dn->dn_Font.ta_Flags = h2;
dn->dn_FontDesc = NULL;
fgets(s, MLEN, f);
sscanf(s, "%ld %ld\n", &dn->dn_XPos, &dn->dn_YPos);
fgets(s, MLEN, f);
sscanf(s, "%lu\n", &dn->dn_Columns);
fgets(s, MLEN, f);
dn->dn_ToolsList = AllocMem(sizeof(struct List), MEMF_PUBLIC|MEMF_CLEAR);
NewList(dn->dn_ToolsList);
if (Stricmp(s, "Tools\n") == 0)
{
struct ToolNode *tn;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
tn = AllocMem(sizeof(struct ToolNode), MEMF_PUBLIC|MEMF_CLEAR);
tn->tn_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
tn->tn_Image = AllocStr(s);
fgets(s, MLEN, f);
tn->tn_Sound = AllocStr(s);
fgets(s, MLEN, f);
AddTail(dn->dn_ToolsList, tn);
}
fgets(s, MLEN, f);
}
else
fprintf(stderr, "Error 2 : %s", s);
AddTail(&ObjectLists[TMOBJTYPE_DOCK], dn);
}
}
else if (Stricmp(s, "Access Objects\n") == 0)
{
struct AccessNode *an;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
an = AllocMem(sizeof(struct AccessNode), MEMF_PUBLIC|MEMF_CLEAR);
an->an_Node.ln_Name = AllocStr(s);
fgets(s, MLEN, f);
NewList(&an->an_Entries);
if (Stricmp(s, "Entries\n") == 0)
{
struct Node *node;
fgets(s, MLEN, f);
while (Stricmp(s, "---\n") != 0)
{
node = AllocMem(sizeof(struct Node), MEMF_PUBLIC|MEMF_CLEAR);
node->ln_Name = AllocStr(s);
fgets(s, MLEN, f);
AddTail(&an->an_Entries, node);
}
fgets(s, MLEN, f);
}
else
fprintf(stderr, "Error 3 : %s", s);
AddTail(&ObjectLists[TMOBJTYPE_ACCESS], an);
}
}
else
fprintf(stderr, "Error 1 : %s", s);
}
fclose(f);
}
else
fprintf(stderr, "can't open %s\n", FileName);
}
#define TMPrefs (char *)ArgArray[0]
#define TMAscii (char *)ArgArray[1]
#define WriteFlag (BOOL) ArgArray[2]
void main(int argc, char *argv[])
{
struct RDArgs *rd;
ULONG ArgArray[3];
ULONG rc = NULL;
char Template[] = "TMPrefs/A,TMAscii/A,WRITE/S";
if (argc == 0)
{
printf("TM2Ascii cannot run from WorkBench !!\n");
printf("Please use CLI instead\n");
}
else
{
ArgArray[0] = NULL;
ArgArray[1] = NULL;
ArgArray[2] = FALSE;
rd = ReadArgs(Template, ArgArray, NULL);
if (rd)
{
BPTR lock;
int i;
for (i=0; i<TMOBJTYPES; i++) NewList(&ObjectLists[i]);
if (WriteFlag)
if (lock = Lock(TMAscii, ACCESS_READ))
{
UnLock(lock);
ReadAscii(TMAscii);
WriteConfigFile(TMPrefs);
}
else
{
PrintFault(205, TMAscii); SetIoErr(205);
rc = 20;
}
else
if (lock = Lock(TMPrefs, ACCESS_READ))
{
UnLock(lock);
ReadConfigFile(TMPrefs);
WriteAscii(TMAscii);
}
else
{
PrintFault(205, TMPrefs); SetIoErr(205);
rc = 20;
}
FreeAllObjects();
}
else
{
PrintFault(116, "");
SetIoErr(116);
rc = 20;
}
if (rd) FreeArgs(rd);
exit(rc);
}
}